package huawei

import (
	"dta-apk/global"
	"dta-apk/utils"
	"encoding/json"
	"fmt"
	"os"
	"strconv"
)

// 获取授权token
func getAccessToken() string {
	paramMap := map[string]interface{}{
		"grant_type":    "client_credentials",
		"client_id":     global.Config.App.Huawei.ClientId,
		"client_secret": global.Config.App.Huawei.ClientSecret,
	}

	result := utils.PostBodyHeader(api_token, paramMap, utils.JsonHeader(nil))
	var jsonData map[string]interface{}
	err := json.Unmarshal([]byte(result), &jsonData)
	if err != nil {
		return ""
	}
	// 获取token
	token := jsonData["access_token"]
	return token.(string)

}

// 应用信息
func GetAppDetails(packageName string) (*AppInfoResult, bool) {
	isEx, appId := GetAppId(packageName)
	if !isEx {
		return nil, false
	}
	// 请求参数
	queryMap := map[string]string{
		"appId":       appId,
		"lang":        "zh-CN", // 查询的语言
		"releaseType": "1",     // 应用发布方式，默认1
	}
	// 请求接口
	result := utils.GetQueryHeaders(api_app_info, queryMap, getClientHeader())
	utils.Info("华为应用信息：" + result)
	var appResult AppInfoResult
	handleResult(result, &appResult)
	if appResult.Ret.Code == 0 {
		return &appResult, true
	}
	return nil, false
}

/*
获取文件上传配置

- 参数fileName： 原始文件名，需包含文件后缀。主要用于在生成上传地址时获取原始文件后缀。
- 参数contentLength：文件内容的大小，单位：字节。
*/
func getUploadConfig(appId, fileName, contentLength string) (bool, *uploadConfig) {
	// 请求参数
	queryMap := map[string]string{
		"appId":         appId,
		"fileName":      fileName,
		"contentLength": contentLength,
	}
	// 请求接口
	result := utils.GetQueryHeaders(api_upload_config, queryMap, getClientHeader())
	// 处理结果
	var uploadConfig uploadConfigResult
	handleResult(result, &uploadConfig)
	utils.Info("文件上传配置获取结果：%v", uploadConfig)
	if uploadConfig.Ret.Code == 0 {
		return true, &uploadConfig.UrlInfo
	}
	return false, nil
}

// 上传文件
func UploadFile(appId, filePath string) (string, bool) {
	fileName, fileSize := utils.GetFileNameAndSize(filePath)
	// 获取文件上传配置
	uploadResult, uploadConfig := getUploadConfig(appId, fileName, strconv.FormatInt(fileSize, 10))
	if !uploadResult {
		return "获取文件上传配置失败", false
	}

	headers := map[string]string{
		"Authorization":        uploadConfig.Headers.Authorization,
		"x-amz-content-sha256": uploadConfig.Headers.XAmzContentSha256,
		"x-amz-date":           uploadConfig.Headers.XAmzDate,
		"Host":                 uploadConfig.Headers.Host,
		"user-agent":           uploadConfig.Headers.UserAgent,
		"Content-Type":         uploadConfig.Headers.ContentType,
		"client_id":            global.Config.App.Huawei.ClientId,
	}
	// 请求路径
	url := uploadConfig.Url
	// 文件内容
	content, _ := os.ReadFile(filePath)
	// 上传文件
	updateResult := utils.PutFileHeader(url, content, headers)
	// 文件上传成功后，保存文件地址
	utils.Info("文件上传结果：%s", updateResult)
	return "", true
}

// 应用更新
func UpdateApk(packageName, filePath, updateDesc string) (bool, string) {
	isEx, appId := GetAppId(packageName)
	if !isEx {
		return false, ""
	}
	var msg = "success"
	// 上传文件
	uploadMsg, uploadResult := UploadFile(appId, filePath)
	fmt.Println(uploadMsg)
	fmt.Println(uploadResult)
	// 判断文件上传是否成功
	if !uploadResult {
		return false, uploadMsg
	}
	submitParam := map[string]string{
		"appId":       appId,
		"remark":      updateDesc, // 备注
		"releaseType": "1",        // 全网发布
	}
	submitResult := utils.PostFormHeader(api_app_submit, submitParam, getClientHeader())
	utils.Info("应用提交结果：%s", submitResult)
	// 结果处理
	var submitRet SubmitResult
	json.Unmarshal([]byte(submitResult), &submitRet)
	if submitRet.Ret.Code != 0 {
		return false, submitRet.Ret.Msg
	}
	return true, msg
}

// 查询应用包名对应的appid
func GetAppId(packageName string) (bool, string) {
	queryMap := map[string]string{
		"packageName":  packageName,
		"packageTypes": "1",
	}
	result := utils.GetQueryHeaders(api_app_id, queryMap, getClientHeader())
	utils.Info("华为应用AppId获取结果：%s", result)
	// 结果处理
	var appIdResult AppIdResult
	json.Unmarshal([]byte(result), &appIdResult)
	if appIdResult.Ret.Code != 0 {
		return false, appIdResult.Ret.Msg
	}
	return true, appIdResult.Appids[0].Value

}
